package net.lgy.db;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import org.apache.ibatis.type.JdbcType;

import java.util.Collections;

public class MyBatisPlusGenerator {
    public static void main(String[] args) {
        try {
            // 数据库连接信息 - 请仔细检查这些信息是否正确
            String userName = "root";
            String password = "138241";
            String serverInfo = "117.72.167.161:3308"; // 注意端口是否正确，默认是3306，这里是3308
            String targetModuleNamePath = "/"; // 根据实际项目结构调整
            String dbName = "lgy-account";

            // 需要生成代码的表名
            String[] tables = {
                    "account", "file","account_file","file_chunk", "file_suffix","file_type", "share", "share_file", "storage"
            };

            // 构建JDBC连接URL
            String jdbcUrl = String.format(
                    "jdbc:mysql://%s/%s?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=true",
                    serverInfo, dbName
            );

            System.out.println("尝试连接数据库: " + jdbcUrl);
            System.out.println("使用用户: " + userName);

            // 使用 FastAutoGenerator 快速配置代码生成器
            FastAutoGenerator.create(jdbcUrl, userName, password)
                    .globalConfig(builder -> {
                        builder.author("日落前的星星")        // 设置作者
                                .commentDate("yyyy-MM-dd")
                                .enableSpringdoc()
                                .disableOpenDir() // 禁止打开输出目录
                                .dateType(DateType.ONLY_DATE)   // 定义生成的实体类中日期类型
                                .outputDir(System.getProperty("user.dir") + targetModuleNamePath + "/src/main/java"); // 指定输出目录
                    })
                    .packageConfig(builder -> {
                        builder.parent("net.lgy") // 父包模块名
                                .entity("model")      // Entity 包名
                                .mapper("mapper")     // Mapper 包名
                                .pathInfo(Collections.singletonMap(
                                        OutputFile.xml,
                                        System.getProperty("user.dir") + targetModuleNamePath + "/src/main/resources/mapper"
                                )); // 设置mapperXml生成路径
                    })
                    .dataSourceConfig(builder -> {
                        // Mysql下tinyint字段转换
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            if (JdbcType.TINYINT == metaInfo.getJdbcType()) {
                                return DbColumnType.BOOLEAN;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        });
                    })
                    .strategyConfig(builder -> {
                        builder.addInclude(tables) // 设置需要生成的表名
                                .entityBuilder()
                                .enableFileOverride() // 开启生成Entity层文件覆盖
                                .idType(IdType.ASSIGN_ID) // 主键策略 雪花算法
                                .enableLombok() // 开启lombok
                                .logicDeleteColumnName("del") // 逻辑删除字段
                                .enableTableFieldAnnotation() // 属性加上注解
                                .formatFileName("%sDO") // 格式化生成的文件名称
                                .controllerBuilder().disable() // 不生成Controller层
                                .serviceBuilder().disable() // 不生成Service层
                                .mapperBuilder()
                                .enableFileOverride() // 开启生成Mapper层文件覆盖
                                .formatMapperFileName("%sMapper")
                                .superClass(BaseMapper.class) // 继承的父类
                                .enableBaseResultMap() // 开启生成resultMap
                                .enableBaseColumnList() // 开启生成Sql片段
                                .formatXmlFileName("%sMapper");
                    })
                    .templateConfig(builder -> {
                        // 不生成Controller、Service相关文件
                        builder.disable(TemplateType.CONTROLLER, TemplateType.SERVICE, TemplateType.SERVICE_IMPL);
                    })
                    .execute(); // 执行生成

            System.out.println("代码生成成功！");
        } catch (Exception e) {
            System.err.println("代码生成失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}